package com.util;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * Gestion du mot de passe utilisateur.
 *
 * @author Cyril Schumacher
 */
public class PasswordHash {
    // <editor-fold defaultstate="collapsed" desc="Constantes.">
    /**
     * Grain de sel pour le mot de passe.
     */
    private final static String _SALT = "booxtore";
    /**
     * Nom de l'algorithme de hashage.
     */
    private final static String _CRYPTAGE_NAME = "MD5";
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="Méthodes.">
    // <editor-fold defaultstate="collapsed" desc="Privées.">
    /**
     * Ajoute le grain de sel.
     *
     * @return Retourne le mot de passe avec le grain de sable.
     */
    private static String _addSalt(String password) {
        return password.concat(_SALT);
    }

    /**
     * Crypte le mot de passe.
     *
     * @param password Mot de passe.
     * @return Retourne un tableau de byte représentant le mot de passe.
     * @throws NoSuchAlgorithmException
     * @see java.security.MessageDigest
     */
    private static byte[] _hash(String password) throws NoSuchAlgorithmException {
        MessageDigest messageDigest = MessageDigest.getInstance(_CRYPTAGE_NAME);
        messageDigest.update(password.getBytes());
        return messageDigest.digest();
    }
    // </editor-fold>

    /**
     * Effectue un hashage de mot de passe.
     *
     * @param password Mot de passe.
     * @return Retourne le mot de passe crypté.
     */
    public static String crypt(String password) {
        try {
            // Hash le mot de passe.
            byte[] hashPassword = _hash(_addSalt(password));

            // Parcours le tableau de byte en reformant le mot de passe
            // en une chaîne de caractère.
            StringBuilder buffer = new StringBuilder();
            for (byte character : hashPassword) {
                buffer.append(Integer.toHexString((int) (character & 0xff)));
            }

            return buffer.toString();
        } catch (NoSuchAlgorithmException e) {
            return password;
        }
    }
    // </editor-fold>
}
